import functools
'''
1.变量可以指向函数
2.函数名也是变量
3.高阶函数：一个函数可以接收另一个函数作为参数
'''

def add(x,y,f):
    return f(x)+f(y)

print(add(-5,6,abs))


print("--------------------------------")
'''
map()函数接收两个参数，一个是函数，一个是Iterable，map将传入的函数依次作用到序列的每个元素，并把结果作为新的Iterator返回
'''

def f(x):
    return x*x

iterator  = map(f,[1,2,3,4,5,6,7,8,9])
print(list(iterator))

print("--------------------------------")
'''
reduce()把一个函数作用在一个序列[x1,x2,x3,x4]上，这个函数必须接收两个参数，reduce把结果继续和序列的下一个元素做累积计算
reduce(function f,Iterable iterable)
'''


def f1(x,y):
    return x*10+y

iterator1 = functools.reduce(f1,[1,3,5,7,9])
print(iterator1)



print("--------------字符串转整数------------------")

def str2int(s):
    def fn(x,y):
        return x*10+y
    def char2num(s):
        return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]
    return functools.reduce(fn,map(char2num,s))

print(str2int('123456'))


print("reduce()还可以接受第三个参数,作为初始值")

def prod(L):
    return functools.reduce(lambda x,y:x*y,L)

print(prod([1,2,3,4,5]))


print("--------------------------------")

'''
filter()接收一个函数和一个序列，把函数作用在序列的每个元素上，根据返回值是True还是False决定保留还是丢弃该元素
'''

def is_odd(n):
    return n%2==1

print(list(filter(is_odd,[1,2,3,4,5,6,7,8,9])))


print("--------------------------------")

'''
sorted()函数可以对list进行排序
'''

print(sorted([36,5,-12,9,-21]))


print("--------------------------------")
print("sorted()函数可以接收一个key函数来实现自定义的排序")
def opposite(x):
    return -x
l = [10,5,2,7]
s = sorted(l, key=opposite)
print(s)




